﻿using System;
using System.Data;
using NHibernate;
using NHibernate.SqlTypes;
using NHibernate.UserTypes;

namespace TaskKernel.Domain.Nhibernate.Mappings
{
    //internal class EnumGuidMapper<T> : IUserType
    //{
    //    #region IUserType Members

    //    public Boolean IsMutable
    //    {
    //        get { return false; }
    //    }

    //    public Type ReturnedType
    //    {
    //        get { return typeof (T); }
    //    }

    //    public SqlType[] SqlTypes
    //    {
    //        get { return new[]{SqlTypeFactory.Int16}; }
    //    }

    //    public object NullSafeGet(IDataReader rs, string[] names, object owner)
    //    {
    //        var tmp = new Guid((string)NHibernateUtil.String.NullSafeGet(rs, names[0]));
    //        var type = typeof(T);
    //        var memInfo = type.GetFields();
    //        foreach (var fieldInfo in memInfo)
    //        {
    //            var attrs = fieldInfo.GetCustomAttributes(typeof(EnumGuid), false);
    //            if (attrs != null && attrs.Length > 0)
    //                if (((EnumGuid)attrs[0]).Guid == tmp)
    //                {
    //                    var t = Enum.Parse(typeof(T), fieldInfo.Name);
    //                    return (T)t;
    //                }
    //        }
    //        throw new ArgumentException("Guid: " + tmp + " has no EnumGuid defined!");
    //    }

    //    public void NullSafeSet(IDbCommand cmd, object value, int index)
    //    {
    //        if (value == null)
    //            ((IDataParameter)cmd.Parameters[index]).Value = DBNull.Value;
    //        else
    //        {
    //            var val = ((T)value).GetEnumGuid();
    //            ((IDataParameter)cmd.Parameters[index]).Value = val;
    //        }
    //    }

    //    public object DeepCopy(object value)
    //    {
    //        return value;
    //    }

    //    public object Replace(object original, object target, object owner)
    //    {
    //        return original;
    //    }

    //    public object Assemble(object cached, object owner)
    //    {
    //        return cached;
    //    }

    //    public object Disassemble(object value)
    //    {
    //        return value;
    //    }

    //    public new bool Equals(object x, object y)
    //    {
    //        if (ReferenceEquals(x, y))
    //            return true;
    //        if (x == null || y == null)
    //            return false;
    //        return x.Equals(y);
    //    }

    //    public int GetHashCode(object x)
    //    {
    //        return x == null ? typeof (T).GetHashCode() : x.GetHashCode();
    //    }

    //    #endregion
    //}
}